package com.ming_za.od_updater_sdk.utils;

/**
 * 二进制相关工具类
 */
public class BinaryUtils {

    /**
     * 将int转换成数组
     * @param value int值
     * @return byte数组
     */
    public static byte[] intToByteArray(int value) {
        byte[] bytes = new byte[4];
        bytes[0] = (byte) (value >> 24);
        bytes[1] = (byte) (value >> 16);
        bytes[2] = (byte) (value >> 8);
        bytes[3] = (byte) value;
        return bytes;
    }

    /**
     * 将long转换成数组
     * @param value long值
     * @return byte数组
     */
    public static byte[] longToByteArray(long value) {
        byte[] bytes = new byte[8];
        bytes[0] = (byte) (value >> 56);
        bytes[1] = (byte) (value >> 48);
        bytes[2] = (byte) (value >> 40);
        bytes[3] = (byte) (value >> 32);
        bytes[4] = (byte) (value >> 24);
        bytes[5] = (byte) (value >> 16);
        bytes[6] = (byte) (value >> 8);
        bytes[7] = (byte) value;
        return bytes;
    }

    /**
     * 给byte数组填充0
     * @param bytes byte数组
     * @param offset 偏移量
     * @param length 长度
     */
    public static void fillZero(byte[] bytes, int offset, int length) {
        for (int i = 0; i < length; i++) {
            bytes[offset + i] = 0;
        }
    }

    /**
     * 将int类型插入数组中
     * @param bytes byte数组
     * @param offset 偏移量
     * @param value 需要插入的int值
     */
    public static void insertInt(byte[] bytes, int offset, int value) {
        bytes[offset] = (byte) (value >> 24);
        bytes[offset + 1] = (byte) (value >> 16);
        bytes[offset + 2] = (byte) (value >> 8);
        bytes[offset + 3] = (byte) value;
    }

    /**
     * 将byte转换成int
     * @param bytes byte数组
     * @return 转换后的int
     */
    public static int byteArrayToInt(byte[] bytes) {
        return ((bytes[0] & 0xFF) << 24) |
                ((bytes[1] & 0xFF) << 16) |
                ((bytes[2] & 0xFF) << 8)  |
                (bytes[3] & 0xFF);
    }

    /**
     * 将byte转换成long
     * @param bytes byte数组
     * @return 转换后的long
     */
    public static long byteArrayToLong(byte[] bytes) {
        return ((long) (bytes[0] & 0xFF) << 56) |
                ((long) (bytes[1] & 0xFF) << 48) |
                ((long) (bytes[2] & 0xFF) << 40) |
                ((long) (bytes[3] & 0xFF) << 32) |
                ((long) (bytes[4] & 0xFF) << 24) |
                ((long) (bytes[5] & 0xFF) << 16) |
                ((long) (bytes[6] & 0xFF) << 8)  |
                ((long) (bytes[7] & 0xFF));
    }

}
